import { App, ref, UnwrapRef } from "vue";
import { ModuleInterface, ModuleConfig, SendCmd } from "./types";
import LoginForm from "./components/index.vue";

const config: ModuleConfig = {
  id: "LoginForm",
  name: "用户登录模块",
  version: "1.0.0",
  description: "负责用户认证"
};

export class LoginModule<EventData, CmdParams> implements ModuleInterface<EventData, CmdParams> {
  config = config;
  // 内部存储数据（完全隐藏）
  private eventData: UnwrapRef<EventData>;
  // 外部传入的指令发送方法
  private sendCmd: SendCmd<CmdParams>;

  constructor(initialData: EventData, sendCmd: SendCmd<CmdParams>) {
    // 初始化内部数据（响应式但不暴露）
    this.eventData = ref(initialData) as unknown as UnwrapRef<EventData>;
    this.sendCmd = sendCmd;
  }
  sendCommand(cmd: string, params?: CmdParams | undefined): void {
    console.log("向平台发送指令", cmd, params);
    // 调用平台注入的底层方法，带上模块标识
    this.sendCmd(this.config.id, cmd, params);
  }

  // 安装模块：注册组件并提供内部方法
  install(app: App): void {
    // 注册全局组件
    app.component("LoginForm", LoginForm);

    // 提供获取数据的方法（而非直接提供数据）
    app.provide("get-login-data", () => this.getEventData());

    // 提供发送指令的方法（封装模块名）
    app.provide("send-login-cmd", (cmd: string, params?: CmdParams) => {
      console.log("发送登录模块指令", cmd, params);
      // this.sendCmd("LoginForm", cmd, params);
      this.sendCommand(cmd, params); // 不再直接调用this.sendCmd，而是经过sendCommand转发
    });
  }

  // 供组件内部获取数据
  getEventData(): EventData {
    return this.eventData as EventData;
  }

  // 供外部更新数据（被动接收）
  updateEventData(data: Partial<EventData>): void {
    console.log("更新数据了", data);
    Object.assign(this.eventData as object, data);
  }

  async startup(): Promise<void> {
    console.log("登录模块初始化完成");
  }
}

// 导出模块创建函数
export const createLoginModule = <EventData, CmdParams>(initialData: EventData, sendCmd: SendCmd<CmdParams>): ModuleInterface<EventData, CmdParams> => {
  return new LoginModule<EventData, CmdParams>(initialData, sendCmd);
};

export default createLoginModule;
